1 using System.Collections;
2 using
System.Collections.Generic;
3 using
UnityEngine;
4
5
6 public
class KingMovement : Movement, IPieceMovement {
7
8     
private bool didCastling = false;
9     
private Node[,] specialNodes;
10     
private Piece[] rooks;
11
12     
private GCPlayer p1;
13     
private GCPlayer p2;
14     
private Grid grid;
15
16     
public KingMovement(GCPlayer player, Piece piece) : base(player,piece) {
17         BoundComputations += ComputeBound;
18         specialNodes =
new Node[2,2];
19         rooks =
new Piece[2];
20         grid = GameManager.Instance.Grid;
21         p1 = GameManager.Instance.P1;
22         p2 = GameManager.Instance.P2;
23     }
24
25     
public override void ComputeBound() {
26         Node currNode = piece.Node;
27         
int origRow = currNode.row;
28         
int origCol = currNode.col;
29
30         
for (int row = -1; row <= 1; row++) {
31             
for (int col = -1; col <= 1; col++) {
32                 
if (row == 0 && col == 0) continue;
33
34                 
int newRow = origRow + row;
35                 
int newCol = origCol + col;
36                 ComputeMoveOrEatPiece(grid.GetNodeAt(newRow, newCol));
37             }
38         }
39
40         
if (!moved && !didCastling && !player.IsChecked) {
41             
//check left
42             
int left = 1;
43             
bool freeLeft = true;
44             
int sign = GetSign();
45             
while (true) {
46                 
int newCol = origCol - left * sign;
47                 
if (newCol < 0 || newCol >= grid.Cols) break;
48                 Node toCheckNode = grid.GetNodeAt(origRow, newCol);
49                 
50                 
if (toCheckNode.EmptySpace) {
51                     
if (Rules.IsGuardedMove(player,piece,toCheckNode)) {
52                         freeLeft =
false;
53                         
break;
54                     }
55                 }
else {
56                     Piece cPiece = toCheckNode.Piece;
57                     
if (Rules.IsAlly(cPiece, piece) && cPiece.PieceType == PieceType.SQUARE) {
58                         rooks[
0] = cPiece;
59                     }
else {
60                         freeLeft =
false;
61                     }
62                     
break;
63                 }
64
65
66                 left++;
67             }
68             
if (freeLeft && !rooks[0].IsMoved) {
69                 specialNodes[
0,0] = grid.GetNodeAt(origRow, origCol - 1 * sign); //for rook
70                 specialNodes[
0,1] = grid.GetNodeAt(origRow, origCol - 2 * sign); //for king
71                 ComputeMovePiece(specialNodes[
0,1]);
72             }
73
74             
//check right
75             
int right = 1;
76             
bool freeRight = true;
77             
while (true) {
78                 
int newCol = origCol + right * sign;
79                 
if (newCol < 0 || newCol >= grid.Cols) break;
80                 Node toCheckNode = grid.GetNodeAt(origRow, newCol);
81                 
82                 
if (toCheckNode.EmptySpace) {
83                     
if (Rules.IsGuardedMove(player,piece,toCheckNode)) {
84                         freeRight =
false;
85                         
break;
86                     }
87                 }
else {
88                     Piece cPiece = toCheckNode.Piece;
89                     
if (Rules.IsAlly(cPiece, piece) && cPiece.PieceType == PieceType.SQUARE) {
90                         rooks[
1] = cPiece;
91                     }
else {
92                         freeRight =
false;
93                     }
94                     
break;
95                 }
96
97
98                 right++;
99             }
100             
if (freeRight && !rooks[1].IsMoved) {
101                 specialNodes[
1,0] = grid.GetNodeAt(origRow, origCol + 1 * sign); //for rook
102                 specialNodes[
1,1] = grid.GetNodeAt(origRow, origCol + 2 * sign); //for king
103                 ComputeMovePiece(specialNodes[
1,1]);
104             }
105             
106         }
107     }
108
109     
int GetSign() {
110         
if (player == p1) {
111             
return 1;
112         }
else {
113             
return -1;
114         }
115     }
116
117     
public override void Moved() {
118         
if (rooks[0] == null && rooks[1] == null) return;
119         
if (!moved) {
120             moved =
true;
121             
if (!didCastling) {
122                 
if (specialNodes[0,0] != null && piece.Node == specialNodes[0,1]) {
123                     rooks[
0].MoveToXZ(specialNodes[0,0], UpdateLeftRook);
124                     didCastling =
true;
125                 }
else if(specialNodes[1,0] != null && piece.Node == specialNodes[1,1]) {
126                     rooks[
1].MoveToXZ(specialNodes[1,0], UpdateRightRook);
127                     didCastling =
true;
128                 }
129             }
130         }
131     }
132
133     
private void UpdateLeftRook() {
134         rooks[
0].UpdateNode(specialNodes[0,0]);
135     }
136
137     
private void UpdateRightRook() {
138         rooks[
1].UpdateNode(specialNodes[1,0]);
139     }
140 }


check left

specialNodes[0,0] = grid.GetNodeAt(origRow, origCol - 1 * sign); for rook

specialNodes[0,1] = grid.GetNodeAt(origRow, origCol - 2 * sign); for king

check right

specialNodes[1,0] = grid.GetNodeAt(origRow, origCol + 1 * sign); for rook

specialNodes[1,1] = grid.GetNodeAt(origRow, origCol + 2 * sign); for king



Gõ tìm kiếm nhanh...